package co.edu.usbcali.egrapico.logica;

import java.util.Hashtable;

/**
 * API para la traducci�n de un
 * <Code>Programa</Code> en <I>GraPiCO Textual</I> hacia <I>C�lculo PiCO</I>.
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Marzo de 2005
 */
public class Traslator {

    String programPiCO = "";
    Hashtable messagesHashtable;
    MainProgram programToTraslate;

    /**
     * M�todo constructor de la clase
     * <Code>Traslator</Code>.<P> Toma un programa representado en <I>GraPiCO
     * Textual</I> y lo prepara para su traducci�n hacia <I>C�lculo PiCO</I>,
     * quit�ndole saltos de linea, tabulaciones y espacios.
     *
     * @param programGraPicoT Expresi�n equivalente a la representaci�n de un
     * <Code>Programa</Code> en <I>GraPiCO Textual</I>
     */
    public Traslator(String programGraPicoT) {

        SemanticAnalizer.ClearAllHashtables();
        programGraPicoT = programGraPicoT.replaceAll("\n", "");
        programGraPicoT = programGraPicoT.replaceAll("\r", "");
        programGraPicoT = programGraPicoT.replaceAll(" ", "");
        programToTraslate = new MainProgram(programGraPicoT);
    }

    /**
     * M�todo generador de la traducci�n de un
     * <Code>Programa</Code> en <I>C�lculo PiCO</I>.<P> Devuelve el programa en
     * <I>C�lculo PiCO</I> solo si no se gener� ning�n mensaje tipo <I>Error</I>
     * en el <I>An�lisis Sem�ntico</I>.
     *
     * @return
     * <Code>Programa</Code> traducido a <I>C�lculo PiCO</I>.
     */
    public String traslate() {

        try {
            programPiCO = programToTraslate.traslate();
            SemanticAnalizer.SumaryAllTables();
        } catch (Exception ex) {
            SemanticAnalizer.PutGeneralMessages("Error realizando la traducci�n . Verifique su programa");
            programPiCO = "";
        }
        return programPiCO;
    }

    /**
     * M�todo que devuelve una tabla hash de mensajes. <P> Si la traducci�n no
     * present� errores, se retorna la tabla de mensajes sem�nticos, en caso
     * contrario se retorna la tabla de mensajes generales.
     *
     * @return Tabla de mensajes. Si hubo traducci�n de programa a PiCO se
     * obtiene la tabla de mensajes sem�nticos, en caso contrario se obtiene la
     * tabla de mensajes generales.
     */
    public Hashtable getMessagesHashtable() {

        // Se valida que la traducci�n se haya realizado exitosamente
        if (programPiCO != "") {
            messagesHashtable = SemanticAnalizer.GetSemanticMessages();
            return messagesHashtable;
        } else {
            messagesHashtable = SemanticAnalizer.GetGeneralMessages();
            return messagesHashtable;
        }

    }
}